/*
 * table_CppToken_t.c
 *
 *  Created on: 2012/04/01
 *      Author: guanxiaoying
 */
#include "../../parser/coredef.h"

/*KIND_PPTOKEN		*/
typedef struct _PPTOKEN {
	U2 usPPTokenKind;	/* 2 */
	U2	usRecCall;		/* 3 */
	AST  astName;				/* 5 */
	AST  astCodeScp;
	AST  macroExt;
	AST  astTmpMacro; /* 7 */
}PPTOKEN, *PPPTOKEN;

#define TableSize  (sizeof(PPTOKEN))
#define TableType  PPPTOKEN
#define stTable stCppTokenManager.memoryBlocks
#define maxTable stCppTokenManager.maxRecordNum
#define  maxNumPerBlk  (stCppTokenManager.astMaxNum_Block)

static TABLEMANAGER stCppTokenManager = {
//		U4                  usIdx;
		0,
//		PSZ				    con_pszName;    constant
		__FILE__,
//		U2					con_usSize;		constant
		TableSize,
//		U2					block_num;	　　　　　　　Reset clear  際　要
		0,
//		S4					astMaxNum_Block;     １回設定のみ
		0,
//		S4					astTabNum_LastPage; 　　　　Reset clear  際　要
		0,
//		S4					astMaxNum_LastPage;     Reset clear  際　要
		0,
//		U4					ulMaxByte;	　　　　　　　　　　クリアしない
		0,
//		U4					con_minPageSize;　　　　　　　　　　constant
		0
};
static VOID resetListener( U4  procid, U2 index )
{
	if( procid == stCppTokenManager.u4Idx )
	{
		if( index > 0 && index < MAX_VOLUMN_OF_TABLE )
		{
			stTable[ index-1] = NULL;
		}
	}
}
static TableType core_getTable( AST index )
{
	TableType temp = (TableType)Check_Com( &stCppTokenManager, resetListener,  index );
	if( temp != NULL ){ return &temp[index%maxNumPerBlk]; } return NULL;
}
static BOOL ClearTable( VOID )
{
	return Clear_Com( &stCppTokenManager );
}
static BOOL ResetTable( VOID )
{
	return Reset_Com( &stCppTokenManager );
}
static BOOL AllocTable( AST astReqArg )
{
	return AllocTable_Com( &stCppTokenManager, astReqArg, resetListener );
}
static AST getMaxLineNum( VOID )
{
	return maxTable;
}
/*D*/
/**************************************************************************
* 関 数 名 : copyTable
* 機    能 : 同じテーブルの行のブロックを移動する
* 引 き 数 ：
* 　　　　　　　astOrg :コピー元の開始行の連番
* 		　astDst：　コピー先の開始行の連番
*         astlenth: ブロック中の行の数
* 戻 り 値 : 成功する場合、1。失敗する場合、0
* 詳細内容 :  メモリ移動
************************************************************************/
static BOOL copyTable( AST  astOrg,  AST  astDst,  AST astLenth )
{
	return Copy_Com( &stCppTokenManager, resetListener, astOrg, astDst, astLenth );
}

/* give up the way that defining get/set function pointer in the struct,
 * because of memory volume.
 */
//ACCESS_U2_FIELD tokenKind;
static U2 getTokenKind( AST index ){
	TableType pTbl = core_getTable( index );
	if( pTbl == NULL )
	{
		return 0;
	}
	return pTbl->usPPTokenKind;
}
static U2 setTokenKind( AST index, U2 value )
{
	TableType pTbl = core_getTable( index );
	if( pTbl == NULL )
	{
		return 0;
	}
	return pTbl->usPPTokenKind = value;
}
//ACCESS_BOOL_FIELD recFlag;
static BOOL getRecFlag( AST index ){
	TableType pTbl = core_getTable( index );
	if( pTbl == NULL )
	{
		return 0;
	}
	return pTbl->usRecCall;
}
static BOOL setRecFlag( AST index, BOOL value )
{
	TableType pTbl = core_getTable( index );
	if( pTbl == NULL )
	{
		return 0;
	}
	return pTbl->usRecCall = value;
}
//ACCESS_STR_FIELD  name;
static CHAR* getTokenName( AST index ){
	TableType pTbl = core_getTable( index );
	if( pTbl == NULL )
	{
		return "";
	}
	return stCppLabelStrAccess.getStr(pTbl->astName);
}
static AST setTokenName( AST index, CHAR* value )
{
	TableType pTbl = core_getTable( index );
	if( pTbl == NULL )
	{
		return 0;
	}
	return pTbl->astName = stCppLabelStrAccess.addStr(value);
}
static AST connectTokenName( AST index, CHAR* value )
{
	TableType pTbl = core_getTable( index );
	if( pTbl == NULL )
	{
		return 0;
	}
	return pTbl->astName = stCppLabelStrAccess.appendStr( pTbl->astName, value);
}
//ACCESS_IDX_FIELD  location;
static AST getMacroExt( AST index ){
	TableType pTbl = core_getTable( index );
	if( pTbl == NULL )
	{
		return 0;
	}
	return pTbl->macroExt;
}
static AST setMacroExt( AST index, AST value )
{
	TableType pTbl = core_getTable( index );
	if( pTbl == NULL )
	{
		return 0;
	}
	return pTbl->macroExt = value;
}
//ACCESS_IDX_FIELD  codeScp;
static AST getCodeScope( AST index ){
	TableType pTbl = core_getTable( index );
	if( pTbl == NULL )
	{
		return 0;
	}
	return pTbl->astCodeScp;
}
static AST setCodeScope( AST index, AST value )
{
	TableType pTbl = core_getTable( index );
	if( pTbl == NULL )
	{
		return 0;
	}
	return pTbl->astCodeScp = value;
}
//ACCESS_IDX_FIELD  macroExtStack;
static AST getMacroExtStk( AST index ){
	TableType pTbl = core_getTable( index );
	if( pTbl == NULL )
	{
		return 0;
	}
	return pTbl->astTmpMacro;
}
static AST setMacroExtStk( AST index, AST value )
{
	TableType pTbl = core_getTable( index );
	if( pTbl == NULL )
	{
		return 0;
	}
	return pTbl->astTmpMacro = value;
}
const CPPTOEKN_T_ACCESS stCppTokenAccess = {
//		BOOL (*clear)( VOID );
		ClearTable,
//		BOOL (*reset)( VOID );
		ResetTable,
//		BOOL (*alloc)( AST );
		AllocTable,
//		BOOL (*copy)( AST, AST, AST );
		copyTable,
//		AST  (*getMax)( VOID );
		getMaxLineNum,
		connectTokenName,
		{
				getTokenKind,
				setTokenKind
		},
		{
				getRecFlag,
				setRecFlag
		},
		{
				getTokenName,
				setTokenName
		},
		{
				getCodeScope,
				setCodeScope
		},
		{
				getMacroExt,
				setMacroExt
		},
		{
				getMacroExtStk,
				setMacroExtStk
		}
};
